package com.ctibook.booksystem.dao.bookcatalog;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.lucene.analysis.Analyzer;

import com.cti.ftpservice.vo.PageViewVO;
import com.ctibook.booksystem.model.bookcatalog.BookInfo;
import com.ctibook.booksystem.model.bookcatalog.BookInfoExtral;
import com.ctibook.booksystem.vo.bookcatalog.BookInfoSearchNormalVO;
import com.ctibook.booksystem.vo.bookcatalog.BookInfoStatisticsTJVo;

/**
 * @author 鲁永刚 E-mail: luyg@ctibook.com
 * @version 创建时间：Sep 16, 2014 10:26:29 AM 书目全文搜索
 */
public interface BookInfoFullTextSearchDao {
	public PageViewVO<BookInfo> getBook(int pageIndex, int pageSize);
	
	/**
	 * 根据isbn号列表分页查询
	 */
	public PageViewVO<BookInfo> getBooksByIsbns(List<String> isbns,int pageIndex,int pageSize);
	
	/**
	 * 获取不存在的isbn号列表
	 * @param isbns
	 * @return
	 */
	public List<String> getNotExistIsbnsByIsbns(List<String> isbns);
	
	/**
	 * 多字段检索  isbn,title,chineseTitle,author,clcs.clc,description,publisher.name,subjects.name
	 * @param searchText
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public PageViewVO<BookInfo> getBookByAnyProp(String searchText,int pageIndex,int pageSize);
	
	/**
	 * 根据单字段查询 propName可取值（isbn,title,chineseTitle,author,clcs.clc,description,publisher.name,subjects.name）
	 * @param propName
	 * @param searchText
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public PageViewVO<BookInfo> getBookBySingleProp(String propName,Object searchValue,int pageIndex, int pageSize);

	/**
	 * 重新构建BookInfo的索引
	 */
	public void rebuildIndex();
	
	public void rebuildIndexBookInfoExtral();

	
	/**
	 * keyworkAnalyzer分词器查询
	 * @param propName
	 * @param propValue
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public PageViewVO<BookInfo> getBookByKeyWordAnalyzer(String propName, String propValue, int pageIndex, int pageSize);
	
	/**
	 * 根据字符串和分词器查找书目信息
	 * @param queryText
	 * @param analyzer
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public PageViewVO<BookInfo> getBooksPageViewByQueryTextAndAnalyzer(String queryText, Analyzer analyzer,
			int pageIndex, int pageSize);

	/**
	 * 根据isbn查找唯一的书目信息
	 * @param isbn
	 * @return
	 */
	public BookInfo getUniqueBookByIsbn(String isbn);
	
	public List<BookInfo> getFullTextBookInfoByIsbns(String[] isbns);

	/**
	 * 全文检索，多个属性对应一个值
	 * @param propNames 属性名称
	 * @param keyword 属性值
	 * @param mustPropName 必须存在的属性名称
	 * @param mustPropValue 必须存在的属性值
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public PageViewVO<BookInfo> getBookByMultiProps(Set<String> propNames,
			String keyword, String mustPropName, boolean mustPropValue, int pageIndex,
			int pageSize);

	/**
	 * 根据属性名称获取属性值，进行distinct过滤
	 * @param string
	 * @return
	 */
	public List<String> getDistinctListByField(String string);


	/**
	 * 根据map查找，map分为必须和可选的，其中key为字段名，value为检索词
	 * @param mapMustProps
	 * @param mapShouldProps
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public PageViewVO<BookInfo> getBookInfoByProps(
			Map<String, Object> mapMustProps,
			Map<String, Object> mapShouldProps, int pageIndex, int pageSize);
	
	/**
	 * 前驱匹配
	 * @param field
	 * @param matchValue
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public PageViewVO<BookInfo> fullTextSearchByPrefixMatch(String field,
			String matchValue, int pageIndex, int pageSize);

	/**
	 * 模糊匹配
	 * @param field
	 * @param matchValue
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public PageViewVO<BookInfo> fullTextSearchByWhildMatch(String field,
			String matchValue, int pageIndex, int pageSize);

	/**
	 * 自动匹配
	 * @param field
	 * @param matchValue
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public PageViewVO<BookInfo> fullTextSearchByAutoMatch(String field,
			String matchValue, int pageIndex, int pageSize);

	/**
	 * 根据专题id、类别id、订阅者id、最小书目数量获取书目信息
	 * @param subjectIds
	 * @param categoryIds
	 * @param subscripeUserId
	 * @param minBooksCount
	 * @return
	 */
	public List<BookInfo> fullTextSearchBooksBySubscripeUserInfo(
			List<String> subjectIds, List<String> categoryIds,
			String subscripeUserId, int minBooksCount);

	/**
	 * 获取有主题词且没有中文主题词的书目id集合
	 * @return
	 */
	public List<String> fullTextSearchByNotTranslateChineseSubjectHeadingsIds();
	
	
	/**
	 * 根据出版年查询数据
	 * @param publisherYear
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public PageViewVO<BookInfo> getBookInfoByPublisherYear(int publisherYear, int pageIndex, int pageSize);
	
	
	public PageViewVO<BookInfo> getBookInfoByNormalSearchVO(BookInfoSearchNormalVO vo, int pageIndex, int pageSize);
	
	public BookInfoExtral getFullTextSearchBookInfoExtralByIsbn(String isbn);
	
	public  List<BookInfoStatisticsTJVo> groupingByQuery(BookInfoSearchNormalVO vo);

}
